package com.redepronik.negosys.invfac.service;

import static com.redepronik.negosys.utils.Utils.newBigDecimal;
import static com.redepronik.negosys.utils.Utils.timestamp;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.redepronik.negosys.invfac.dao.PagoEntradaDao;
import com.redepronik.negosys.invfac.entity.Egreso;
import com.redepronik.negosys.invfac.entity.Entrada;
import com.redepronik.negosys.invfac.entity.Pagoentrada;
import com.redepronik.negosys.invfac.entityAux.CobroReporte;

@Service
public class PagoEntradaServiceImpl implements PagoEntradaService {

	@Autowired
	private PagoEntradaDao pagoEntradaDao;

	@Autowired
	private EgresoService egresoService;

	public String actualizar(Pagoentrada pagoEntrada) {
		pagoEntradaDao.actualizar(pagoEntrada);
		return "SAVE";
	}

	public void cobro(List<Pagoentrada> listaPagoEntrada,
			List<CobroReporte> listaEgresos) {

		CobroReporte cobroReporte = null;
		Egreso egreso = null;
		int ic = 0;
		int ie = 0;
		BigDecimal cuota = newBigDecimal();
		BigDecimal saldo = newBigDecimal();
		do {
			// OBTENER VALORES INICIALES
			if (saldo.compareTo(newBigDecimal()) <= 0) {
				cobroReporte = listaEgresos.get(ie);
				egreso = egresoService.obtenerPorEgresoId(cobroReporte.getId());
				saldo = cobroReporte.getSaldo();
			}
			if (cuota.compareTo(newBigDecimal()) == 0)
				cuota = listaPagoEntrada.get(ic).getCuota();

			// CONSTRUIR PAGO ENTRADA
			Pagoentrada pagoEntradaAux = listaPagoEntrada.get(ic);
			Pagoentrada pagoEntrada = new Pagoentrada();
			pagoEntrada.setBanco(pagoEntradaAux.getBanco());
			pagoEntrada.setChequevaucher(pagoEntradaAux.getChequevaucher());
			pagoEntrada.setCuentatarjeta(pagoEntradaAux.getCuentatarjeta());
			pagoEntrada.setCuota(pagoEntradaAux.getCuota());
			pagoEntrada.setFechacheque(pagoEntradaAux.getFechacheque());
			pagoEntrada.setFechapago(pagoEntradaAux.getFechapago());
			if (pagoEntradaAux.getTipopago().getTipopagoid() == 3)
				pagoEntrada.setPagado(false);
			else
				pagoEntrada.setPagado(true);

			pagoEntrada.setFechagiro(pagoEntradaAux.getFechagiro());
			pagoEntrada.setAnulado(false);
			pagoEntrada.setDetalle(pagoEntradaAux.getDetalle());
			pagoEntrada.setTipopago(pagoEntradaAux.getTipopago());

			// CONSTRUIR ENTRADA
			Entrada entrada = new Entrada();
			entrada.setFechalimite(pagoEntrada.getFechapago());
			entrada.setFechamora(pagoEntrada.getFechapago());
			entrada.setFechapago(pagoEntrada.getFechapago());
			if (pagoEntradaAux.getTipopago().getTipopagoid() == 3)
				entrada.setPagado(false);
			else
				entrada.setPagado(true);

			entrada.setSaldo(newBigDecimal());

			// PASAR CUOTAS SEGUN CONDICION
			if (saldo.compareTo(cuota) >= 0) {
				entrada.setCuota(cuota);
				pagoEntrada.setCuota(cuota);
				saldo = saldo.subtract(cuota);
				cuota = newBigDecimal();
				ic++;
			} else {
				entrada.setCuota(saldo);
				pagoEntrada.setCuota(saldo);
				BigDecimal saldoAux = saldo;
				saldo = saldo.subtract(cuota);
				cuota = cuota.subtract(saldoAux);
				ie++;
			}

			// AGREGAR PAGO ENTRADA->ENTRADA->EGRESO
			entrada.setPagoentradas(new ArrayList<Pagoentrada>());
			entrada.addPagoentrada(pagoEntrada);
			egreso.addEntrada(entrada);

			// DAR POR CANCELADO EL EGRESO
			if (saldo.compareTo(newBigDecimal()) <= 0) {
				egreso.setPagado(true);
				egreso.setFechacierre(timestamp());
				Egreso e = egresoService.obtenerPorCodigo(egreso
						.getCodigodocumento().substring(3));
				e.setPagado(true);
				e.setFechacierre(timestamp());
				egresoService.actualizar(e, null);
			}

			// GUARDAR EL EGRESO CON SUS ENTRADAS
			// if (saldo.compareTo(newBigDecimal()) <= 0
			// || (ic == listaPagoEntrada.size() && cuota
			// .compareTo(newBigDecimal()) <= 0)) {
			// // listaEgreso.add(egreso);
			//
			// }

		} while (ic <= (listaPagoEntrada.size() - 1));
	}

	public Pagoentrada obtenerPorPagoEntradaId(Integer pagoEntradaId) {
		return pagoEntradaDao.obtenerPorId(Pagoentrada.class, pagoEntradaId);
	}
}